typedef long long LL;
const int maxn=6e4;
class Solution {
    LL K[maxn],B[maxn];
    vector<int>g[maxn];
public:
    vector<int> volunteerDeployment(vector<int>& finalCnt, long long totalNum, vector<vector<int>>& edges, vector<vector<int>>& plans) {
        for(int i=0;i<edges.size();i++){
            g[edges[i][0]].push_back(edges[i][1]);
            g[edges[i][1]].push_back(edges[i][0]);
        }
        int n=finalCnt.size()+1;
        for(int i=0;i<finalCnt.size();i++) B[i+1]=finalCnt[i];
        K[0]=1;B[0]=0;
        for(int i=(int)plans.size()-1;i>=0;i--){
            int num=plans[i][0]; int idx=plans[i][1];
            if(num==1){
                K[idx]*=2;
                B[idx]*=2;
            }
            else if(num==2){
                for(int j=0;j<g[idx].size();j++){
                    int v=g[idx][j];
                    K[v]-=K[idx];
                    B[v]-=B[idx];
                }
            }
            else if(num==3){
                for(int j=0;j<g[idx].size();j++){
                    int v=g[idx][j];
                    K[v]+=K[idx];
                    B[v]+=B[idx];
                }
            }
        }
        vector<int>ans;
        for(int i=0;i<n;i++) totalNum-=B[i];
        long long sum=0;
        for(int i=0;i<n;i++) sum+=K[i];
        long long X=totalNum/sum;
        for(int i=0;i<n;i++){
            ans.push_back(K[i]*X+B[i]);
        }
        return ans;
    }
};
